package com.dabai.iot.core.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import com.dabai.iot.core.dto.ConsumerGroupInput;
import com.dabai.iot.core.dto.ConsumerGroupUpdate;
import com.dabai.iot.core.entity.ConsumerGroupEntity;
import lombok.NonNull;

import java.util.List;

/**
 * 消费组 Service 接口
 *
 * @author kev1n
 */
public interface IConsumerGroupService extends IService<ConsumerGroupEntity> {

    /**
     * 新增
     */
    boolean addConsumer(ConsumerGroupInput input);

    /**
     * 修改
     */
    boolean updateConsumer(ConsumerGroupUpdate update);

    /**
     * 删除
     *
     * @param id 消费组主键id
     */
    boolean deleteConsumer(@NonNull Long id);

    /**
     * 分页
     *
     * @param page
     * @param consumerGroup
     */
    IPage<ConsumerGroupEntity> getConsumerGroupPage(IPage<ConsumerGroupEntity> page, ConsumerGroupEntity consumerGroup);

    /**
     * 根据消费组Token获取实体
     */
    ConsumerGroupEntity getByGroupID(@NonNull String groupID);

    /**
     * 根据消费组ID获取实体缓存
     */
    ConsumerGroupEntity getCacheByGroupID(@NonNull String groupID);

    /**
     * 根据订阅Id获取关联的消费组
     */
    List<ConsumerGroupEntity> getBySubscribeId(@NonNull Long subscribeId);

    /**
     * 根据产品Id获取关联的消费组
     */
    List<ConsumerGroupEntity> getByProductId(@NonNull Long productId);

    /**
     * 根据产品Id获取关联的消费组缓存
     */
    List<ConsumerGroupEntity> getCacheByProductId(Long productId);

    /**
     * 解除消费组和某一订阅的关联（至少保留一个）
     *
     * @param serverSubscribeId 产品订阅id
     */
    boolean unsubscription(@NonNull Long consumerId, @NonNull Long serverSubscribeId);

}
